package cn.mdmbct.douyin.data.service.interfaces;

import cn.mdmbct.douyin.common.enums.DataApiDataType;
import cn.mdmbct.douyin.common.exception.ApiCallException;
import cn.mdmbct.douyin.common.proxy.annotations.Mapping;
import cn.mdmbct.douyin.common.proxy.annotations.RequestParam;
import cn.mdmbct.douyin.data.response.user.*;

/**
 * <a href="https://open.douyin.com/platform/doc/6848798450331486212">抖音OpenAPI 数据开放服务 用户数据</a>
 *
 * @author mdmbct  mdmbct@outlook.com
 * @date 2021/4/11 11:17
 * @modified mdmbct
 * @since 1.0
 */
public interface UserDataService {


    /**
     * <a href="https://open.douyin.com/platform/doc/6848798450331486212">获取用户视频情况</a>
     * <p>
     * Scope: `data.external.user`需要申请权限需要用户授权<p>
     * 该接口用于获取用户视频情况。
     * <p>
     * 注：用户首次授权应用后，需要第二天才会产生全部的数据；
     *
     * @param openId   通过/oauth/access_token/获取，用户唯一标志
     * @param dataType 近7/15天；输入7代表7天、15代表15天、30代表30天 {@link DataApiDataType}
     * @return
     * @throws ApiCallException
     */
    @Mapping("/data/external/user/item")
    DataUserItemBaseRes.DataUserItemResData getUserItems(@RequestParam("open_id") String openId,
                                                         @RequestParam(value = "date_type", method = "getDays") DataApiDataType dataType) throws ApiCallException;


    /**
     * <a href="https://open.douyin.com/platform/doc/6848798450331453444">获取用户粉丝数</a>
     * <p>
     * Scope: `data.external.user`需要申请权限需要用户授权
     * <p>
     * 该接口用于获取用户粉丝数。
     * <p>
     * 注：用户首次授权应用后，需要第二天才会产生全部的数据；
     *
     * @param openId   通过/oauth/access_token/获取，用户唯一标志
     * @param dataType 近7/15天；输入7代表7天、15代表15天、30代表30天 {@link DataApiDataType}
     * @return
     * @throws ApiCallException
     */
    @Mapping("/data/external/user/fans")
    DataUserFansRes.DataUserFansResData getUserFansCount(@RequestParam("open_id") String openId,
                                                         @RequestParam(value = "date_type", method = "getDays") DataApiDataType dataType) throws ApiCallException;

    /**
     * <a href="https://open.douyin.com/platform/doc/6848798450331518980">获取用户点赞数</a>
     * <p>
     * Scope: `data.external.user`需要申请权限需要用户授权
     * <p>
     * 该接口用于获取用户点赞数。
     * <p>
     * 注：用户首次授权应用后，需要第二天才会产生全部的数据；
     *
     * @param openId   通过/oauth/access_token/获取，用户唯一标志
     * @param dataType 近7/15天；输入7代表7天、15代表15天、30代表30天 {@link DataApiDataType}
     * @return
     * @throws ApiCallException
     */
    @Mapping("/data/external/user/like")
    DataUserLikeRes.DataUserLikeResData getUserLikeCount(@RequestParam("open_id") String openId,
                                                         @RequestParam(value = "date_type", method = "getDays") DataApiDataType dataType) throws ApiCallException;

    /**
     * <a href="https://open.douyin.com/platform/doc/6848798450331420676">获取用户评论数</a>
     * <p>
     * Scope: `data.external.user`需要申请权限需要用户授权
     * <p>
     * 该接口用于获取用户评论数。
     * <p>
     * 注：用户首次授权应用后，需要第二天才会产生全部的数据；
     *
     * @param openId   通过/oauth/access_token/获取，用户唯一标志
     * @param dataType 近7/15天；输入7代表7天、15代表15天、30代表30天 {@link DataApiDataType}
     * @return
     * @throws ApiCallException
     */
    @Mapping("/data/external/user/comment")
    DataUserCommentRes.DataUserCommentResData getUserCommentCount(@RequestParam("open_id") String openId,
                                                                  @RequestParam(value = "date_type", method = "getDays") DataApiDataType dataType) throws ApiCallException;

    /**
     * <a href="https://open.douyin.com/platform/doc/6848798471810451459">获取用户分享数</a>
     * <p>
     * Scope: `data.external.user`需要申请权限需要用户授权
     * <p>
     * 该接口用于获取用户分享数。
     * <p>
     * 注：用户首次授权应用后，需要第二天才会产生全部的数据；
     *
     * @param openId   通过/oauth/access_token/获取，用户唯一标志
     * @param dataType 近7/15天；输入7代表7天、15代表15天、30代表30天 {@link DataApiDataType}
     * @return
     * @throws ApiCallException
     */
    @Mapping("/data/external/user/share")
    DataUserShareRes.DataUserShareResData getUserShareCount(@RequestParam("open_id") String openId,
                                                            @RequestParam(value = "date_type", method = "getDays") DataApiDataType dataType) throws ApiCallException;

    /**
     * <a href="https://open.douyin.com/platform/doc/6848798450331551748">获取用户主页访问数</a>
     * <p>
     * Scope: `data.external.user`需要申请权限需要用户授权
     * <p>
     * 该接口用于获取用户主页访问数。
     * <p>
     * 注：用户首次授权应用后，需要第二天才会产生全部的数据；
     *
     * @param openId   通过/oauth/access_token/获取，用户唯一标志
     * @param dataType 近7/15天；输入7代表7天、15代表15天、30代表30天 {@link DataApiDataType}
     * @return
     * @throws ApiCallException
     */
    @Mapping("/data/external/user/profile")
    DataUserProfileRes.DataUserProfileResData getUserProfileCount(@RequestParam("open_id") String openId,
                                                                  @RequestParam(value = "date_type", method = "getDays") DataApiDataType dataType) throws ApiCallException;
}
